from django.shortcuts import render, redirect, reverse
from book.models import BookInfo

# Create book views here.


def home(request):
    """
    重定向 redirect 函数
    - 功能：创建一个HTTP响应，告诉用户的浏览器去请求一个新的URL，而不是直接返回数据给浏览器。

    - 参数：
        1.字符串形式：直接传入目标URL作为字符串。
        2.视图名形式：可以传入视图的名称，这样可以根据URL配置自动解析到正确的URL。
        3.视图名加参数形式：可以同时传递视图名和额外的参数来构建URL。

    - 返回值：
        redirect函数返回一个HttpResponseRedirect对象，它继承自HttpResponse类，
        包含一个302状态码和一个指向新URL的Location头。
        浏览器会自动发送一个GET请求到这个新的URL位置。
    """


    return render(request, 'index.html')


def book(request):

    books = BookInfo.objects.all()

    return render(request, 'book/book_list.html', context={'books': books})


def book_find(request, book_id):

    find_book = BookInfo.objects.get(id=book_id)

    context = {'book': find_book}

    return render(request, 'book/book_detail.html', context=context)



def book_string(request):
    """ 直接传入目标URL作为字符串。 """
    return redirect('https://www.baidu.com')


def book_view_name(request):
    """ 可以传入视图的名称，这样可以根据URL配置自动解析到正确的URL。 """
    return redirect('book:book')


def book_view_name_arg(request):
    """ 可以同时传递视图名和额外的参数来构建URL。 """
    return redirect('book:book_find', book_id=1)


def book_reverse(request):
    """
    reverse函数
    - 功能：
        主要功能是基于视图的名称和参数动态生成URL。

    - 参数：
        1. viewname：
            视图的名称，通常是在urls.py中通过name关键字参数指定的名字。
            也可以是一个视图函数或类的路径（字符串形式），例如 'myapp.views.my_view' 或 'myapp.views.MyView.as_view()'。
        2. args：
            位置参数，用于填充URL中的占位符。这些参数按照顺序匹配URL中的变量部分。
            示例：reverse('view-name', args=(arg1, arg2)) 必须是元组
        3. kwargs：
            关键字参数，用于填充URL中的变量部分。这些参数以键值对的形式传递，并且URL中的变量部分将根据这些键值对进行替换。
            示例：reverse('view-name', kwargs={'slug': 'my-slug'})
    - 返回值：
        reverse函数返回一个字符串，表示生成的URL。这个字符串是一个相对路径，不包含域名或协议（如http://或https://）。
        如果需要生成完整的URL，通常会结合当前请求的域名或其他上下文信息来拼接完整的URL。
    """
    # path = reverse('book:book_find', args=(1,))
    path = reverse('book:book_find', kwargs={'book_id': 2})

    return redirect(path)
